package net.jcip.examples.chapter7;

import java.math.BigInteger;
import java.util.concurrent.*;

/**
 * PrimeProducer
 * <p/>
 * Using interruption for cancellation
 *
 * @author Brian Goetz and Tim Peierls
 */
public class PrimeProducer extends Thread {
    private final BlockingQueue<BigInteger> queue;


    PrimeProducer(BlockingQueue<BigInteger> queue) {
        this.queue = queue;
    }

    /**
     * 线程中断机制
     * 线程在执行阻塞操作时（如BlockingQueue.put），如果在阻塞期间被中断，通常会抛出InterruptedException并清除中断状态。因此，线程应该能够响应中断并退出阻塞状态。然而，具体情况取决于阻塞操作如何处理中断。
     *
     * BlockingQueue.put的行为
     * 对于BlockingQueue.put方法，当队列已满时，该方法会使当前线程进入阻塞状态，直到队列有空间可用或者线程被中断。根据Java文档：
     *
     * 如果当前线程在等待放入元素时被中断，则会抛出InterruptedException。
     */
    public void run() {
        try {
            BigInteger p = BigInteger.ONE;
            while (!Thread.currentThread().isInterrupted())
                queue.put(p = p.nextProbablePrime());
        } catch (InterruptedException consumed) {
            /* Allow thread to exit */
        }
    }

    public void cancel() {
        interrupt();
    }
}
